﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;

class Father {
public:
	Father() {
		cout << "Father构造函数" << endl;
	}
	~Father() {
		cout << "Father析构函数" << endl;
	}
};

class Son : public Father {
public:
	Son() {
		cout << "Son构造函数" << endl;
	}
	~Son() {
		cout << "Son析构函数" << endl;
	}
};

void test01() {
	/*
	new子类对象时，先调用父类构造函数，后调用子类构造函数，所以，父类构造函数必须是public 的，否则报错。
	析构函数调用顺序相反。

	Father构造函数
	Son构造函数
	Son析构函数
	Father析构函数
	*/
	Son *son = new Son; 
	delete son; 
}

// 继承和组合 
class A {
public:
	A() {
		cout << "A 构造函数" << endl;
	}
	~A() {
		cout << "A 析构函数" << endl;
	}
public:
	Son son;
};
class B {
public:
	B() {
		cout << "B 构造函数" << endl;
	}
	~B() {
		cout << "B 析构函数" << endl;
	}
};
class C {
public:
	C() {
		cout << "C 构造函数" << endl;
	}
	~C() {
		cout << "C 析构函数" << endl;
	}
};
class D : public A{
public:
	D() {
		cout << "D 构造函数" << endl;
	}
	~D() {
		cout << "D 析构函数" << endl;
	}
public:
	B b;
	C c;
};

/*
new对象时，有继承和组合时，对象生成销毁顺序：
构造：
1.父类成员构造函数；
2.父类构造函数；
3.子类成员构造函数；
4.子类构造函数；
析构：
1.子类析构函数；
2.子类成员析构函数；
3.父类析构函数；
4.父类成员析构函数。

Father构造函数
Son构造函数
A 构造函数
B 构造函数
C 构造函数
D 构造函数
D 析构函数
C 析构函数
B 析构函数
A 析构函数
Son析构函数
*/
void test02() {
	D d;
}

int main()
{

	// test01(); 
	test02(); 

	system("pause");
	return EXIT_SUCCESS;
}